﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bukstor.Biz;
using Bukstor.Biz.Utils;

namespace Bukstor.UI.Utilidades
{
    public static class TraerLibros
    {
        static BukstorBDEntities Entidades { get { return new BukstorBDEntities(); } }

        static TraerLibros()
        {
            
        }

        private static IEnumerable<CatTitulosRow> procesarLibros(IEnumerable<Libro>libros){
            List<CatTitulosRow> salida = new List<CatTitulosRow>(libros.Count());
            CatTitulosRow c;
            foreach (Libro l in libros)
            {
                if (l.discontinuo) continue;
                c = new CatTitulosRow();
                if (!l.InventarioReference.IsLoaded) l.InventarioReference.Load();
                if (!l.Autores.IsLoaded) l.Autores.Load();
                c.Id = l.id;
                c.Precio = l.Inventario.precioUnitario;
                c.Titulo = l.titulo;
                c.Autores = ACadena.Autores(l.Autores);
                salida.Add(c);
            }
            return salida;
        }

        public static IEnumerable<CatTitulosRow> PorSubcategoria(int subcategoria)
        {
            IEnumerable<Libro> Titulos = from Libro l in Entidades.Libros
                                         where !l.discontinuo && l.Subcategoria.id == subcategoria
                                         select l;
            return procesarLibros(Titulos);
        }

        public static IEnumerable<CatTitulosRow> PorTitulo(string titulo)
        {
            IEnumerable<Libro> libros = from Libro l in Entidades.Libros where l.titulo.Contains(titulo) select l;
            return procesarLibros(libros);
        }

        public static IEnumerable<CatTitulosRow> PorAutor(string autor)
        {
            IEnumerable<Autor> autores = (from Autor a in Entidades.Autores
                          where a.apellido.Contains(autor) || a.nombre.Contains(autor)
                          select a);
            List<Libro> librosUnicos = new List<Libro>();
            foreach (Autor a in autores)
            {
                if (!a.Libros.IsLoaded) a.Libros.Load();
                foreach (Libro l in a.Libros)
                {
                    if (!librosUnicos.Contains(l))
                    {
                        librosUnicos.Add(l);
                    }
                }
            }
            return procesarLibros(librosUnicos);
        }

        public static IEnumerable<CatTitulosRow> PorEditorial(string editorial)
        {
            IEnumerable<Libro> libros = from Libro L in Entidades.Libros where L.Editorial.nombre.Contains(editorial) select L;
            return procesarLibros(libros);
        }

        public static IEnumerable<CatTitulosRow> PorISBN(string isbn)
        {
            isbn = isbn.Trim();
            int index = isbn.IndexOf('-');
            while (index!=-1)
            {
                isbn = isbn.Remove(index, 1);
                index = isbn.IndexOf('-');
            }
            IEnumerable<Libro> libros = from Libro L in Entidades.Libros where L.isbn == isbn select L;
            return procesarLibros(libros);
        }
    }
}